/*
 * Copyright 2009 eBusinessInformation
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.excilys.ymca.activity;

import java.util.ArrayList;
import java.util.List;

import roboguice.activity.GuiceActivity;
import roboguice.inject.InjectView;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

import com.excilys.ymca.R;
import com.excilys.ymca.model.Contact;
import com.excilys.ymca.service.ContactService;
import com.excilys.ymca.service.exception.ServiceException;
import com.excilys.ymca.view.ContactAdapter;
import com.google.inject.Inject;

/**
 * Activité listant les contacts de l'annuaire.
 * 
 * @author Pierre-Yves Ricau ( py.ricau+ymca @ gmail.com )
 */
public class ContactListActivity extends GuiceActivity {

    /**
     * Vue contenant la liste des contacts.
     */
    @InjectView(R.id.contact_list)
    private ListView       contactListView;

    /**
     * Liste des contacts.
     */
    private List<Contact>  contacts;

    /**
     * Service permettant de récupérer une liste de contacts. L'activité n'a pas
     * connaissance de l'implémentation utilisée.
     */
    @Inject
    private ContactService contactListService;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        /*
         * L'appel à la méthode parente est obligatoire.
         */
        super.onCreate(savedInstanceState);

        /*
         * Les vues contenues dans le layout donné en paramètre sont créées.
         */
        setContentView(R.layout.contact_list);

        retrieveData();
        addContent();
        addListeners();
    }

    /**
     * Récupération des données métier depuis les services
     */
    private void retrieveData() {

        new AsyncTask<Void, Void, List<Contact>>() {
            private ServiceException exception = null;

            @Override
            protected List<Contact> doInBackground(Void... params) {
                try {
                    return contactListService.getContactList();
                } catch (ServiceException e) {
                    exception = e;
                    return null;
                }
            }

            @Override
            protected void onPostExecute(List<Contact> result) {
                if (exception != null) {
                    contacts = new ArrayList<Contact>();
                    Toast.makeText(ContactListActivity.this, exception.getUserMessageId(), Toast.LENGTH_LONG).show();
                } else {
                    contacts = result;
                }
                fillData();
            }
        }.execute();

    }

    /**
     * Ajoute du contenu aux vues
     */
    private void addContent() {

        /*
         * Définition du titre de l'activité
         */
        setTitle(R.string.contact_list_activity_title);

    }

    private void fillData() {
        /*
         * Création d'un adapter entre la liste de contact et la listView.
         * ContactAdapter est un fils de SimpleAdapter.
         */
        ContactAdapter adapter = new ContactAdapter(this, contacts);

        contactListView.setAdapter(adapter);
    }

    /**
     * Ajoute des listeners aux composants graphiques pour réagir aux actions de
     * l'utilisateur.
     */
    private void addListeners() {
        contactListView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                /*
                 * On demande au système l'exécution d'une nouvelle activité
                 * (ContactDetailsActivity), en lui donnant en paramètre le
                 * contact sélectionné.
                 */
                Intent i = new Intent(ContactListActivity.this, ContactDetailsActivity.class);
                i.putExtra(ContactDetailsActivity.CONTACT_EXTRA, contacts.get(position));
                startActivity(i);
            }
        });
    }

}